//package com.cqx.collection.util;
//
//import ma.glasnost.orika.MapperFacade;
//import ma.glasnost.orika.MapperFactory;
//import ma.glasnost.orika.impl.DefaultMapperFactory;
//import ma.glasnost.orika.metadata.ClassMapBuilder;
//
//import java.util.Collection;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.concurrent.ConcurrentHashMap;
//
//public class BeanCopier {
//    private BeanCopier() {
//    }
//
//    private static final MapperFactory MAPPER_FACTORY = new DefaultMapperFactory.Builder().build();
//
//    /**
//     * 默认字段实例
//     */
//    private static final MapperFacade MAPPER_FACADE = MAPPER_FACTORY.getMapperFacade();
//
//    /**
//     * 默认字段实例集合
//     */
//    private static Map<String, MapperFacade> CACHE_MAPPER_FACADE_MAP = new ConcurrentHashMap<>();
//
//    /**
//     * 映射实体.
//     * <p> 默认各个字段名称相同.
//     *
//     * @param toClass 映射类对象
//     * @param data    数据（对象）
//     * @return 映射类对象
//     * @apiNote 如果字段名称不同且没有做映射, 则该字段为null.
//     */
//    public static <E, T> E map(Class<E> toClass, T data) {
//        return MAPPER_FACADE.map(data, toClass);
//    }
//
//    /**
//     * 映射实体.
//     * <p>对不同参数名称指定映射关系.
//     *
//     * @param toClass   映射类对象
//     * @param data      数据（对象）
//     * @param configMap 不同参数名称之间的映射集合, 用于两个类参数名称不同的情况.
//     * @return 映射类对象
//     * @see
//     */
//    public static <E, T> E map(Class<E> toClass, T data, Map<String, String> configMap) {
//        MapperFacade mapperFacade = getMapperFacade(toClass, data.getClass(), configMap);
//        return mapperFacade.map(data, toClass);
//    }
//
//    /**
//     * 映射集合
//     * <p> 默认各个字段名称相同.
//     *
//     * @param toClass 映射类对象
//     * @param data    数据（集合）
//     * @return 映射类对象
//     * @apiNote 如果字段名称不同且没有做映射, 则该字段为null.
//     */
//    public static <E, T> List<E> mapAsList(Class<E> toClass, Collection<T> data) {
//        return MAPPER_FACADE.mapAsList(data, toClass);
//    }
//
//    /**
//     * 映射集合
//     * <p>对不同参数名称指定映射关系.
//     *
//     * @param toClass   映射类
//     * @param data      数据（集合）
//     * @param configMap 自定义配置
//     * @return 映射类对象
//     * @see
//     */
//    public static <E, T> List<E> mapAsList(Class<E> toClass, Collection<T> data, Map<String, String> configMap) {
//        T t = data.stream().findFirst().orElseThrow(() -> new RuntimeException("映射集合，数据集合为空"));
//        MapperFacade mapperFacade = getMapperFacade(toClass, t.getClass(), configMap);
//        return mapperFacade.mapAsList(data, toClass);
//    }
//
//    /**
//     * 获取自定义映射
//     *
//     * @param toClass   映射类
//     * @param dataClass 数据映射类
//     * @param configMap 自定义配置
//     * @return 映射类对象
//     */
//    private static <E, T> MapperFacade getMapperFacade(Class<E> toClass, Class<T> dataClass, Map<String, String> configMap) {
//        String mapKey = dataClass.getCanonicalName() + "_" + toClass.getCanonicalName();
//        MapperFacade mapperFacade = CACHE_MAPPER_FACADE_MAP.get(mapKey);
//        if (Objects.isNull(mapperFacade)) {
//            MapperFactory factory = new DefaultMapperFactory.Builder().build();
//            ClassMapBuilder classMapBuilder = factory.classMap(dataClass, toClass);
//            configMap.forEach(classMapBuilder::field);
//            classMapBuilder.byDefault().register();
//            mapperFacade = factory.getMapperFacade();
//            CACHE_MAPPER_FACADE_MAP.put(mapKey, mapperFacade);
//        }
//        return mapperFacade;
//    }
//}
